Overview
Shutter DAO 0x36 will integrate with Octant v2 through the SHUGrantPool Strategy — an ERC-4626 yield-donating vault configured with Morpho's "Steakhouse" USDC yield strategy (rated A+ by Credora, ~4-6% APY).
| Component | Purpose | Capital |
|---|---|---|
| SHUGrantPool Strategy | Generate yield for public goods funding | 1M USDC |
Architecture Note: The strategy IS the ERC-4626 vault. No MultistrategyVault wrapper is needed since only one strategy is approved by the DAO. This simplifies deployment, reduces gas costs, and eliminates unnecessary complexity.
Prerequisites (Pending Items)
The following items must be resolved before executing the DAO proposal:
| Item | Status | Owner | Notes |
|---|---|---|---|
| Dragon Funding Pool address | ⏳ Pending | Shutter DAO | Strategy donation recipient |
| Keeper Bot address | ⏳ Pending | Shutter DAO | Strategy keeper for harvesting |
| Emergency Shutdown Admin address | ⏳ Pending | Shutter DAO | Can shutdown strategy and perform emergency withdrawals |
⚠️ Action Required: Update this document with actual addresses before submitting the proposal.
Verified On-Chain Addresses
| Entity | Address | Network |
|---|---|---|
| Shutter DAO Treasury | 0x36bD3044ab68f600f6d3e081056F34f2a58432c4 |
Ethereum |
| Azorius Module | 0xAA6BfA174d2f803b517026E93DBBEc1eBa26258e |
Ethereum |
| SHU Token | 0xe485E2f1bab389C08721B291f6b59780feC83Fd7 |
Ethereum |
| USDC | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 |
Ethereum |
| Morpho Strategy Factory | 0x052d20B0e0b141988bD32772C735085e45F357c1 |
Ethereum |
| Tokenized Strategy | 0xb27064A2C51b8C5b39A5Bb911AD34DB039C3aB9c |
Ethereum |
| Yearn Strategy USDC | 0x074134A2784F4F66b6ceD6f68849382990Ff3215 |
Ethereum |
| PaymentSplitter Factory | 0x5711765E0756B45224fc1FdA1B41ab344682bBcb |
Ethereum |
SHUGrantPool Strategy
The MorphoCompounderStrategy is itself an ERC-4626 vault (via Yearn's TokenizedStrategy). Treasury deposits USDC directly into the strategy.
Underlying Yield Source
Yearn Strategy USDC — Deposits into Morpho lending markets via Yearn's aggregator vault.
Role Assignments
| Role | Assigned To | Description |
|---|---|---|
| Management | Shutter DAO Treasury (0x36bD...32c4) |
Administrative role (set keeper, set emergency admin, shutdown) |
| Keeper | Dedicated Bot/EOA | REQUIRED: Authorized to call report()/tend() to harvest yields without governance votes |
| Emergency Admin | Shutter DAO Treasury (0x36bD...32c4) |
Can shutdown the strategy and perform emergency withdrawals |
Critical: The Keeper should be a dedicated EOA or bot, NOT the Treasury Safe. Assigning Keeper to Treasury would require a governance vote for every harvest, creating severe operational bottlenecks.
Yield Distribution
| Destination | Allocation |
|---|---|
| Dragon Funding Pool | 100% |
Shutter DAO Governance
Architecture
Shutter DAO 0x36 uses Fractal (Decent) for on-chain governance, built on Safe:
| Component | Address / Value |
|---|---|
| Safe (Treasury) | 0x36bD3044ab68f600f6d3e081056F34f2a58432c4 |
| Azorius Module | 0xAA6BfA174d2f803b517026E93DBBEc1eBa26258e |
| Voting Token | SHU (0xe485E2f1...Fd7) |
Execution Call Chain
Critical: From the target contract's perspective, msg.sender is the Safe address (0x36bD...), NOT the Azorius module. This is why all roles are assigned to the Treasury Safe address.
Governance Parameters
See current governance parameters on the Decent DAO App.
Voting Platforms
| Platform | Type | Use Case |
|---|---|---|
| Decent | On-chain | Treasury transactions, contract interactions |
| Snapshot | Off-chain | Temperature checks, non-binding polls |
Execution Playbook
Phase 1: Strategy Deployment
The entire deployment can be executed in a single DAO proposal with 1 batched MultiSend containing 3 operations:
- Deploy Strategy via Factory
- Approve USDC to Strategy (uses precomputed Strategy address)
- Deposit USDC into Strategy
Key optimization: The strategy factory uses CREATE2, allowing address precomputation. This enables batching all 3 operations without waiting for return values.
MultiSend requirement: Execute MultiSend with operation=DELEGATECALL. Using CALL makes msg.sender the MultiSend contract and will break USDC approvals.
Gas Profile
| Component | Gas Cost |
|---|---|
| DAO Proposal (1 batched call, 3 operations) | ~1M |
| EIP-7825 Limit | 16,777,216 |
| Headroom | >92% |
Transaction Details
Transaction 1: Deploy Strategy
Target: 0x052d20B0e0b141988bD32772C735085e45F357c1 (Morpho Strategy Factory)
Function: createStrategy(string,address,address,address,address,bool,address)
Selector: 0x31d89943
Value: 0
Parameters:
_name: "SHUGrantPool"
_management: 0x36bD3044ab68f600f6d3e081056F34f2a58432c4
_keeper: [KEEPER_ADDRESS] (dedicated bot)
_emergencyAdmin: [EMERGENCY_ADMIN_ADDRESS]
_donationAddress: [DRAGON_FUNDING_POOL_ADDRESS]
_enableBurning: false
_tokenizedStrategyAddress: 0xb27064a2c51b8c5b39a5bb911ad34db039c3ab9c
Transaction 2: Approve USDC
Target: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 (USDC)
Function: approve(address,uint256)
Selector: 0x095ea7b3
Value: 0
Parameters:
spender: [STRATEGY_ADDRESS] (from Tx 1)
amount: 1000000000000 (1M USDC with 6 decimals)
Transaction 3: Deposit USDC
Target: [STRATEGY_ADDRESS] (from Tx 1)
Function: deposit(uint256,address)
Selector: 0x6e553f65
Value: 0
Parameters:
assets: 1000000000000 (1M USDC with 6 decimals)
receiver: 0x36bD3044ab68f600f6d3e081056F34f2a58432c4 (Treasury)
Generate Calldata
forge script partners/shutter_dao_0x36/script/GenerateProposalCalldata.s.sol --fork-url $ETH_RPC_URL -vvvv
Post-Deployment Operations
Harvest Operation
Target: [STRATEGY_ADDRESS]
Function: report()
Selector: 0x2606a10b
Value: 0
Calldata: 0x2606a10b
Note: Called by management or keeper to harvest yield.
Emergency Operations
Shutdown Strategy
Target: [STRATEGY_ADDRESS]
Function: shutdownStrategy()
Selector: 0xbe8f1668
Effect: Stops new deposits/mints, allows withdrawals.
Access: management or emergencyAdmin
Emergency Withdraw
Target: [STRATEGY_ADDRESS]
Function: emergencyWithdraw(uint256)
Selector: 0x5312ea8e
Parameters:
_amount: Amount to withdraw (up to full balance)
Prerequisite: Strategy must be shutdown first.
Access: management or emergencyAdmin
Quick Reference: Function Selectors
| Function | Selector | Target | Purpose |
|---|---|---|---|
createStrategy(...) | 0x31d89943 | Morpho Factory | Deploy strategy |
approve(address,uint256) | 0x095ea7b3 | USDC | Allow spending |
deposit(uint256,address) | 0x6e553f65 | Strategy | Deposit funds |
withdraw(uint256,address,address) | 0xb460af94 | Strategy | Withdraw funds |
report() | 0x2606a10b | Strategy | Harvest yield |
shutdownStrategy() | 0xbe8f1668 | Strategy | Emergency shutdown |
emergencyWithdraw(uint256) | 0x5312ea8e | Strategy | Emergency exit |